From 9a9ea5a4b88bef1c9dc38acc2e5af589a87fc196 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 3 Feb 2015 23:27:06 -0800 Subject: [PATCH] Avoid `unwrap` when parsing lockfiles Why not use `try!` instead! Closes #1267 --- src/cargo/ops/lockfile.rs | 8 +++++--- tests/test_bad_config.rs | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/cargo/ops/lockfile.rs b/src/cargo/ops/lockfile.rs index 463d94676..0180d9ce2 100644 --- a/src/cargo/ops/lockfile.rs +++ b/src/cargo/ops/lockfile.rs @@ -4,13 +4,15 @@ use rustc_serialize::{Encodable, Decodable}; use toml::{self, Encoder, Value}; use core::{Resolve, resolver, Package, SourceId}; -use util::CargoResult; +use util::{CargoResult, ChainError, human}; use util::toml as cargo_toml; pub fn load_pkg_lockfile(pkg: &Package) -> CargoResult> { let lockfile = pkg.get_manifest_path().dir_path().join("Cargo.lock"); let source_id = pkg.get_package_id().get_source_id(); - load_lockfile(&lockfile, source_id) + load_lockfile(&lockfile, source_id).chain_error(|| { + human(format!("failed to parse lock file at: {}", lockfile.display())) + }) } pub fn load_lockfile(path: &Path, sid: &SourceId) -> CargoResult> { @@ -24,7 +26,7 @@ pub fn load_lockfile(path: &Path, sid: &SourceId) -> CargoResult let table = toml::Value::Table(try!(cargo_toml::parse(s.as_slice(), path))); let mut d = toml::Decoder::new(table); - let v: resolver::EncodableResolve = Decodable::decode(&mut d).unwrap(); + let v: resolver::EncodableResolve = try!(Decodable::decode(&mut d)); Ok(Some(try!(v.to_resolve(sid)))) } diff --git a/tests/test_bad_config.rs b/tests/test_bad_config.rs index 4597ae763..9b36fd586 100644 --- a/tests/test_bad_config.rs +++ b/tests/test_bad_config.rs @@ -200,3 +200,23 @@ Caused by: ")); }); + +test!(bad_cargo_lock { + let foo = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + version = "0.0.0" + authors = [] + "#) + .file("Cargo.lock", "") + .file("src/lib.rs", ""); + + assert_that(foo.cargo_process("build").arg("-v"), + execs().with_status(101).with_stderr("\ +failed to parse lock file at: [..]Cargo.lock + +Caused by: + expected a section for the key `root` +")); +}); -- 2.30.2